/* Filename: atexit.c
 * Description: atexit(func) 钩子函数在退出时被调用
 * Last modified: humble 20200318 14:51
 */
#include <stdio.h>
#include <stdlib.h>
//#include <unistd.h>

static void usage(void);

static void f1(void) { puts("f1"); }
static void f2(void) { puts("f2"); }
static void f3(void) { puts("f3"); }

static void test(void) {
    puts("begin");
    atexit(f1);
    atexit(f2);
    atexit(f3);  //倒序调用f3 f2 f1
    puts("end");
    // exit(0); //调用钩子函数
    //当自己能确保某些数据是被篡改了，就不要再调用钩子函数，避免脏数据被钩子函数写入或者用到其他地方而引起更多的问题
    //_exit(0); //不调用钩子函数
    //_Exit(0); //不调用钩子函数
}
int main(int argc, char **argv) {
    if(argc != 1){ fprintf(stderr, "argc !=1"); usage(); exit(1); }
    test();
    puts("exiting");
    return 0; //调用钩子函数
}

static void usage(void) {
#define USAGE "Usage:\n\
  Helloworld\n"
    printf(USAGE);
}
